package com.sali.b_design_pattern.f_responsibility_pattern.strategy.method02.pojo.entity;

import java.io.Serializable;

/**
 * @author sali
 * @date 2025/3/16 10:09
 */
public class Result<T> implements Serializable {

    private static final long serialVersionUID = 1L;

    // 状态码，用于表示业务处理结果的状态，如 200 表示成功，500 表示失败等
    private int code;
    // 消息，用于描述业务处理结果的详细信息
    private String message;
    // 数据，用于存储业务处理返回的数据
    private T data;

    // 无参构造函数
    public Result() {
    }

    // 有参构造函数，用于初始化状态码、消息和数据
    public Result(int code, String message, T data) {
        this.code = code;
        this.message = message;
        this.data = data;
    }

    // 获取状态码
    public int getCode() {
        return code;
    }

    // 设置状态码
    public void setCode(int code) {
        this.code = code;
    }

    // 获取消息
    public String getMessage() {
        return message;
    }

    // 设置消息
    public void setMessage(String message) {
        this.message = message;
    }

    // 获取数据
    public T getData() {
        return data;
    }

    // 设置数据
    public void setData(T data) {
        this.data = data;
    }

    public boolean isSuccess() {
        return code == 200;
    }

    // 静态方法，用于创建表示成功的 Result 对象，不包含数据
    public static <T> Result<T> success() {
        return new Result<>(200, "操作成功", null);
    }

    // 静态方法，用于创建表示成功的 Result 对象，包含数据
    public static <T> Result<T> success(T data) {
        return new Result<>(200, "操作成功", data);
    }

    // 静态方法，用于创建表示成功的 Result 对象，包含自定义消息和数据
    public static <T> Result<T> success(String message, T data) {
        return new Result<>(200, message, data);
    }

    // 静态方法，用于创建表示失败的 Result 对象，不包含数据
    public static <T> Result<T> fail() {
        return new Result<>(500, "操作失败", null);
    }

    // 静态方法，用于创建表示失败的 Result 对象，包含自定义消息
    public static <T> Result<T> fail(String message) {
        return new Result<>(500, message, null);
    }

    // 静态方法，用于创建表示失败的 Result 对象，包含自定义状态码和消息
    public static <T> Result<T> fail(int code, String message) {
        return new Result<>(code, message, null);
    }

    @Override
    public String toString() {
        return "Result{" +
                "code=" + code +
                ", message='" + message + '\'' +
                ", data=" + data +
                '}';
    }

}
